import serial


__defaultSerial = "/dev/ttyUSB0"
__defaultBaudrate = 9600

__commandCode = b"\x01\x04\x00\x00\x00\x01\x31\xca"


# 打开端口并验证端口是否为水压计  成功返回True,失败返回False
def openSerial(targetSerial=__defaultSerial, baudrate=__defaultBaudrate):
    global ser
    # 默认打开端口USB0, 波特率9600
    ser = serial.Serial(targetSerial, baudrate, timeout=0.2)
    # 初始化
    ser.parity = serial.PARITY_NONE  # 无校验
    ser.stopbits = 1  # 停止位
    return __isHydraulicGauge()


# 验证端口是否为水压计
def __isHydraulicGauge():
    check = []
    # 三次验证是否有数据返回
    for i in range(3):
        ser.write(__commandCode)
        check.append(ser.read(8))
    if check[0] or check[1] or check[2]:
        return True
    return False


# 读取数据 返回返回int型水压数值,当端口读取失败返回-1
def readData():
    if ser:
        # 输入码 每次提取数据都需要输入
        ser.write(__commandCode)
        # 读取十六进制数据
        ans = ser.read(8)
        if ans:
            return __phraseData(ans)
        else:
            return -1
    else:
        return -1


# 解析数据 将十六进制MODBUS协议数据帧转换为可读int型并返回
def __phraseData(ans):
    Ans = []
    for i in ans:
        Ans.append(i)
    # 解析数据
    data = Ans[3] * 255 + Ans[4]
    return data


# 关闭端口
def closeSerial():
    ser.close()


# 测试
if __name__ == "__main__":
    if openSerial():
        while True:
            print(readData())
    else:
        print("开启失败")
